home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / MIDIMAP.ZIP / MIDIMAP.CPP < prev    next >
C/C++ Source or Header  |  1997-03-11  |  4KB  |  186 lines

  1. // midimap written by Günter Nagler 1996 (gnagler@ihm.tu-graz.ac.at)
  2. #include "midiio.hpp"
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6.  
  7. static char* version = "midimap v1.0 by Günter Nagler (" __DATE__ ")";
  8.  
  9. #ifdef __MSDOS__
  10. #define WRITE_BINARY  "wb"
  11. #define READ_BINARY   "rb"
  12. #else
  13. #define WRITE_BINARY  "w"
  14. #define READ_BINARY   "r"
  15. #endif
  16.  
  17. char* input = 0;
  18. char* output = 0;
  19.  
  20. MidiWrite* write = 0;
  21. int quiet = 0;
  22.  
  23. int mapchannel[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
  24.  
  25. class MidiMap : public MidiCopy
  26. {
  27. public:
  28.   MidiMap(char* name);
  29.  
  30.   virtual void error(const char* msg);
  31.   virtual void warning(const char* msg);
  32.  
  33.   virtual void percent(int perc);
  34. };
  35.  
  36. MidiMap::MidiMap(char* name) : MidiCopy(name)
  37. {
  38. }
  39.  
  40. void MidiMap::percent(int perc)
  41. {
  42.   if (!quiet)
  43.     fprintf(stderr, "%-3d%%\r", perc);
  44. }
  45.  
  46. void MidiMap::error(const char* msg)
  47. {
  48.   printf("Error: %s\n", msg);
  49.   exit(1);
  50. }
  51.  
  52. void MidiMap::warning(const char* msg)
  53. {
  54.   printf("Warning: %s\n", msg);
  55. }
  56.  
  57. void usage()
  58. {
  59.   fprintf(stderr, "MidiMap maps channel numbers\n");
  60.   fprintf(stderr, "usage: MidiMap [-q][-map #[-#] #] input.mid output.mid\n");
  61.   fprintf(stderr, "-version\tget program version\n");
  62.   fprintf(stderr, "-q\tbe quiet\n");
  63.   fprintf(stderr, "-mapchannel c[-d] e\tmap events of channels c..d to channel e (1..16)\n");
  64.   exit(1);
  65. }
  66.  
  67. int main(int argc, char**argv)
  68. {
  69.   argc--; argv++;
  70.   while (argc > 0 && **argv == '-')
  71.   {
  72.     if (strncmp(*argv, "-version", 2) == 0)
  73.     {
  74.       fprintf(stderr, "%s\n", version);
  75.       argc--; argv++;
  76.       if (argc == 0)
  77.     return 0;
  78.       continue;
  79.     }
  80.     if (argc > 0 && strcmp(*argv, "-q") == 0)
  81.     {
  82.       quiet = 1;
  83.       argc--; argv++;
  84.       continue;
  85.     }
  86.     if (strncmp(*argv, "-mapchannel", 2) == 0)
  87.     {
  88.     int firstchannel, secondchannel, destchannel;
  89.  
  90.       argc--; argv++;
  91.       if (argc > 0 && sscanf(*argv, "%u-%u", &firstchannel, &secondchannel) == 2)
  92.       {
  93.     if (firstchannel <= 0 || secondchannel > 16)
  94.     {
  95.       fprintf(stderr, "channel number %s out of range 1-16\n", *argv);
  96.       firstchannel = secondchannel = -1;
  97.     }
  98.     else if (firstchannel > secondchannel)
  99.     {
  100.       fprintf(stderr, "%s: first channel number must be less than second one\n", *argv);
  101.       firstchannel = secondchannel = -1;
  102.     }
  103.     argc--; argv++;
  104.       }
  105.       else if (argc > 0 && isdigit(**argv))
  106.       {
  107.     firstchannel = atoi(*argv);
  108.     if (firstchannel <= 0 || firstchannel > 16)
  109.     {
  110.       fprintf(stderr, "channel number %s out of range 1-16\n", *argv);
  111.       firstchannel = -1;
  112.     }
  113.     secondchannel = firstchannel;
  114.     argc--; argv++;
  115.       }
  116.       else
  117.       {
  118.     fprintf(stderr, "option -mapchannel expects two channel numbers 1-16\n");
  119.     usage();
  120.     break;
  121.       }
  122.       if (argc > 0 && isdigit(**argv))
  123.       {
  124.     destchannel = atoi(*argv);
  125.     argc--; argv++;
  126.       }
  127.       else
  128.       {
  129.     fprintf(stderr, "option -mapchannel expects two channel numbers 1-16\n");
  130.     usage();
  131.     break;
  132.       }
  133.       for (int c = firstchannel; c <= secondchannel; c++)
  134.       if (c != destchannel)
  135.       {
  136.     mapchannel[c-1] = destchannel-1;
  137.       }
  138.       continue;
  139.     }
  140.  
  141.     fprintf(stderr, "invalid option %s\n", *argv);
  142.     argc--; argv++;
  143.     usage();
  144.   }
  145.   if (argc < 2)
  146.     usage();
  147.  
  148.   input = argv[0];
  149.   output = argv[1];
  150.   if (strcmp(input, output) == 0)
  151.   {
  152.     fprintf(stderr, "cannot convert midi to same file\n");
  153.     return 1;
  154.   }
  155.   MidiMap midi(input);
  156.   if (!midi.getf())
  157.   {
  158.     perror(input);
  159.     return 1;
  160.   }
  161.   write = new MidiWrite(output);
  162.   if (!write)
  163.   {
  164.     fprintf(stderr, "out of memory\n");
  165.     return 1;
  166.   }
  167.   if (!write->getf())
  168.   {
  169.     perror(output);
  170.     return 1;
  171.   }
  172.   argc--; argv++;
  173.  
  174.   for (int c = 0; c < 16; c++)
  175.     midi.mapchannel(c, mapchannel[c]);
  176.  
  177.   midi.setoutput(write);
  178.  
  179.   midi.options_ = OPTION_NOSYSEVENTS | OPTION_NOCONTROLS;
  180.   if (!midi.run())
  181.     fprintf(stderr, "%s: midi read error at %04lX\n", input, midi.getpos());
  182.  
  183.   delete write;
  184.   return 0;
  185. }
  186.